package iso2.persistencia;

import iso2.dominio.ClaveInvalidaException;
import iso2.dominio.Usuario;
import iso2.dominio.UsuarioCanceladoException;
import iso2.dominio.UsuarioInvalidoException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class FPUsuario {
	public static void insertUsuario (Usuario usuario) 
			throws SQLException, ConexionesOcupadasException, 
			UsuarioInvalidoException {
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();

		// Insertar el nuevo usuario
		
		PreparedStatement sentencia = conexion.prepareStatement(
		"insert into usuario (email, password, direccion, alta, administrador)" +
		"values(?, ?, ?, ?, ?);");
		
		sentencia.setString(1, usuario.getEmail());
		sentencia.setString(2, usuario.getPassword());
		sentencia.setString(3, usuario.getDireccion());
		sentencia.setBoolean(4, usuario.isAlta());
		sentencia.setBoolean(5, usuario.isAdministrador());
		
		sentencia.executeUpdate();
		agente.liberarConexion(conexion);
	}
	
	public static void bajaUsuario(String email) throws SQLException, 
												ConexionesOcupadasException {
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		
		// Marcar como usuario dado de baja
		
		PreparedStatement sentencia = conexion.prepareStatement(
				"update usuario set alta = false where email = ?;");
		
		sentencia.setString(1, email);
		
		sentencia.executeUpdate();
		agente.liberarConexion(conexion);
	}
	
	public static void validarUsuario(Usuario usuario) 
		throws SQLException, ConexionesOcupadasException, 
				UsuarioInvalidoException, ClaveInvalidaException, 
				UsuarioCanceladoException {
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		
		// Buscar el usuario en la base de datos
		
		PreparedStatement sentencia = conexion.prepareStatement(
				"select * from usuario where email = ?;");
		
		sentencia.setString(1, usuario.getEmail());
		
		ResultSet resultado = sentencia.executeQuery();
		
		// El usuario no existe
		
		if (!resultado.next()) {
			agente.liberarConexion(conexion);
			throw new UsuarioInvalidoException();
		}
		
		// La clave no coincide
		
		if (!usuario.getPassword().equals(resultado.getString("password"))) {
			agente.liberarConexion(conexion);
			throw new ClaveInvalidaException();
		}
		
		// El usuario esta dado de baja
		
		if (!resultado.getBoolean("alta")) {
			agente.liberarConexion(conexion);
			throw new UsuarioCanceladoException();
		}
		
		// Devolver el usuario
		
		usuario.setDireccion(resultado.getString("direccion"));
		usuario.setAlta(resultado.getBoolean("alta"));
		usuario.setAdministrador(resultado.getBoolean("administrador"));

		agente.liberarConexion(conexion);
	}
	
	public static void updateUsuario(Usuario usuario) throws SQLException, 
		ConexionesOcupadasException {
		
		Agente agente = Agente.getInstancia();
		Connection conexion = agente.getConexion();
		
		PreparedStatement sentencia = conexion.prepareStatement(
			"update usuario set password = ?, direccion = ? " +
			"where email = ?;");
		
		sentencia.setString(1, usuario.getPassword());
		sentencia.setString(2, usuario.getDireccion());
		sentencia.setString(3, usuario.getEmail());
		
		sentencia.executeUpdate();
	}
}
